﻿let f0 (list: int list) = [for x in list do x]
let f00 (list: int list) = [for x in list do yield x]
let f000 (list: int list) = [for x in list do let x = x in yield x]
let f0000 (list: int list) = [for x in list do let x = x in x]
let f00000 (list: int list) x y = [for z in list do let foo = z + x in let bar = z + y in yield z + foo + bar]
let f000000 (list: int list) x y = [for z in list do let foo = z + x in let bar = z + y in z + foo + bar]
let f0000000 (list: int list) f x y = [for z in list do f (); let foo = z + x in let bar = z + y in z + foo + bar]
let f00000000 (list: int list) f x y = [for z in list do let foo = z + x in f (); let bar = z + y in z + foo + bar]
let f000000000 (list: int list) f x y = [for z in list do let foo = z + x in let bar = z + y in f (); z + foo + bar]
let f0000000000 (list: int list) (f : unit -> int) x y = [for z in list do let foo = z + x in let bar = z + y in f (); z + foo + bar]

let f1 (list: int list) = [for x in list -> x]
let f2 f (list: int list) = [for x in list -> f x]
let f3 f (list: int list) = [for x in list -> f (); x]
let f4 f g (list: int list) = [for x in list -> f (); g(); x]
let f5 (list: int list) = [for x in list do yield x]
let f6 f (list: int list) = [for x in list do f (); yield x]
let f7 f g (list: int list) = [for x in list do f (); g (); yield x]

let f8 f g (list: int list) = [let y = f () in let z = g () in for x in list -> x + y + z]
let f9 f g (list: int list) = [let y = f () in g (); for x in list -> x + y]
let f10 f g (list: int list) = [f (); g (); for x in list -> x]
let f11 f g (list: int list) = [f (); let y = g () in for x in list -> x + y]
let f12 (f: unit -> int list) y = [for x in f () -> x + y]

// https://github.com/dotnet/fsharp/issues/17708
// Don't read or rebind the loop variable when it is not in scope in the body.
let ``for _ in List.groupBy id [] do ...`` () = [for _ in List.groupBy id [] do 0]
let ``for _ | _ in List.groupBy id [] do ...`` () = [for _ | _ in List.groupBy id [] do 0]
let ``for _ & _ in List.groupBy id [] do ...`` () = [for _ & _ in List.groupBy id [] do 0]
let ``for _, _group in List.groupBy id [] do ...`` () = [for _, _group in List.groupBy id [] do 0]
let ``for _, group in List.groupBy id [] do ...`` () = [for _, group in List.groupBy id [] do group.Length]
let ``for 1 | 2 | _ in ...`` () = [for 1 | 2 | _ in [] do 0]
let ``for Failure _ | _ in ...`` () = [for Failure _ | _ in [] do 0]
let ``for true | false in ...`` () = [for true | false in [] do 0]
let ``for true | _ in ...`` () = [for true | _ in [] do 0]
let ``for _ | true in ...`` () = [for _ | true in [] do 0]
